/**
 * @file mainwindow.h
 * @brief 主窗口类头文件
 *
 * 定义应用程序的主界面，负责：
 * - 管理所有UI组件布局
 * - 协调各个组件间的通信
 * - 处理用户操作和菜单命令
 */

#ifndef MAINWINDOW_H  // 头文件保护宏，防止重复包含
#define MAINWINDOW_H

#include <QMainWindow>  // Qt主窗口基类
#include "src/gui/imagecanvas.h"        // 图像画布组件
#include "src/gui/controlpanel.h"       // 控制面板组件
#include "src/algorithms/inpaintingengine.h" // 修复算法引擎

// 前向声明 - 减少头文件依赖，加快编译速度
class QLabel;          // 文本标签控件
class QPushButton;     // 按钮控件
class QAction;         // 菜单/工具栏动作

/**
 * @brief 主窗口类
 *
 * 继承自QMainWindow，提供标准的应用程序主窗口框架：
 * - 菜单栏、工具栏、状态栏
 * - 中央窗口部件区域
 * - 信号槽机制连接所有功能
 *
 * 设计模式：采用MVC模式的变体
 * - Model: InpaintingEngine (数据模型)
 * - View: ImageCanvas, ControlPanel (视图组件)
 * - Controller: MainWindow (控制器)
 */
class MainWindow : public QMainWindow
{
    Q_OBJECT  // Qt宏，启用元对象系统（信号槽、属性等）

public:
    /**
     * @brief 构造函数
     * @param parent 父窗口指针，为nullptr表示顶级窗口
     */
    explicit MainWindow(QWidget *parent = nullptr);

    /**
     * @brief 析构函数
     *
     * 负责清理动态分配的资源
     * 注意：Qt的父子对象机制会自动销毁子对象
     */
    ~MainWindow();

    // ==================== 槽函数声明 ====================
    // 槽函数用于响应信号，命名通常以'on'开头
private slots:
    void onOpenImage();           // 响应"打开图像"操作
    void onExit();                // 响应"退出"操作
    void onPenToolSelected();     // 选择画笔工具
    void onRectToolSelected();    // 选择矩形工具
    void onEraserToolSelected();  // 选择橡皮擦工具
    void onClearMask();           // 清除蒙版
    void onStartInpainting();     // 开始修复操作

private:
    // ==================== 界面初始化函数 ====================
    void createMenus();           // 创建菜单栏和菜单项
    void createToolbars();        // 创建工具栏和工具按钮
    void createCentralWidget();   // 创建中央窗口部件和布局

    // ==================== 成员变量 - UI组件指针 ====================
    ImageCanvas *imageCanvas;         // 图像画布 - 显示和绘制图像
    ControlPanel *controlPanel;       // 控制面板 - 算法参数设置
    InpaintingEngine *inpaintingEngine; // 修复算法引擎 - 核心算法实现

    // ==================== 工具栏按钮指针 ====================
    QPushButton *openButton;          // "打开图像"按钮
    QAction *openAction;              // "打开图像"菜单动作
    QAction *exitAction;              // "退出"菜单动作
    QPushButton *penToolButton;       // 画笔工具按钮
    QPushButton *rectToolButton;      // 矩形工具按钮
    QPushButton *eraserToolButton;    // 橡皮擦工具按钮
    QPushButton *clearMaskButton;     // 清除蒙版按钮
};

#endif // MAINWINDOW_H  // 头文件结束
